#ifndef __CC_H__
#define __CC_H__

#include "cpu.h"
#include <stdlib.h>
#include <stdio.h>
#include "lwip/opt.h"

#if !LWIP_NO_STDINT_H
#include <stdint.h> // 依赖标准库的固定宽度类型

/* 用宏标记“通用类型已定义”，供其他文件检查 */

/* 定义通用类型 */
/* 1. 固定宽度整数类型定义 */
typedef uint8_t u8_t;
typedef int8_t s8_t;
typedef uint16_t u16_t;
typedef int16_t s16_t;
typedef uint32_t u32_t;
typedef int32_t s32_t;

/* 64位类型（按需定义） */
#if !defined(LWIP_HAVE_INT64) && defined(UINT64_MAX)
#define LWIP_HAVE_INT64 1
#endif
#if LWIP_HAVE_INT64
typedef uint64_t u64_t;
typedef int64_t s64_t;
#endif

typedef uintptr_t mem_ptr_t; // 内存指针类型
#endif                       /* !LWIP_NO_STDINT_H */

/* 2. 标准库类型与系统类型 */
//typedef int sys_prot_t;     // 临界区保护类型
typedef size_t lwip_size_t; // 尺寸类型

/* 3. 格式化字符串宏（用于printf类函数） */
#define U16_F "hu" // u16_t 格式化
#define S16_F "hd" // s16_t 格式化
#define X16_F "hx" // u16_t 十六进制格式化
#define U32_F "lu" // u32_t 格式化
#define S32_F "ld" // s32_t 格式化
#define X32_F "lx" // u32_t 十六进制格式化
#define SZT_F "zu" // size_t 格式化

/* 4. 编译器特性适配 */
#if defined(__ICCARM__) // IAR 编译器
#define PACK_STRUCT_BEGIN
#define PACK_STRUCT_STRUCT
#define PACK_STRUCT_END
#define PACK_STRUCT_FIELD(x) x
#define PACK_STRUCT_USE_INCLUDES

// 内联函数
#define inline __inline
#define CC_FORCE_INLINE __forceinline

// 弱函数
#define CC_WEAK __weak

#elif defined(__CC_ARM) // Keil MDK-ARM 编译器
#define PACK_STRUCT_BEGIN __packed
#define PACK_STRUCT_STRUCT
#define PACK_STRUCT_END
#define PACK_STRUCT_FIELD(x) x

// 内联函数
#define inline __inline
#define CC_FORCE_INLINE __forceinline

// 弱函数
#define CC_WEAK __weak

#elif defined(__GNUC__) // GCC 编译器
#define PACK_STRUCT_BEGIN
#define PACK_STRUCT_STRUCT __attribute__((__packed__))
#define PACK_STRUCT_END
#define PACK_STRUCT_FIELD(x) x

// 内联函数
#define inline inline
#define CC_FORCE_INLINE __attribute__((always_inline)) inline

// 弱函数
#define CC_WEAK __attribute__((weak))

#elif defined(__TASKING__) // Tasking 编译器
#define PACK_STRUCT_BEGIN
#define PACK_STRUCT_STRUCT
#define PACK_STRUCT_END
#define PACK_STRUCT_FIELD(x) x

// 内联函数
#define inline __inline
#define CC_FORCE_INLINE __forceinline

// 弱函数
#define CC_WEAK __weak

#else
#error "Unsupported compiler! Please add compiler-specific definitions to cc.h"
#endif

#define LWIP_PROVIDE_ERRNO 1

#if LWIP_PROVIDE_ERRNO
#include "lwip/err.h"  // 引用 err.h 中的错误码枚举，不重复定义
extern int* lwip_errno(void);
#define errno (*lwip_errno())  // 仅定义 errno 宏，不碰错误码
#endif

/* 5. 平台功能配置 */
// 字节序定义（默认小端，根据CPU实际情况修改）
#define LITTLE_ENDIAN 1234
#define BIG_ENDIAN 4321
#define CC_BYTE_ORDER LITTLE_ENDIAN

// 系统环境配置（1=裸机，0=RTOS）
#define LWIP_NO_SYS 1

// 禁用volatile（0=启用，1=禁用，默认启用）
#define CC_NO_VOLATILE 0

// 空函数宏定义
#define CC_EMPTY_FUNC \
    void func(void) {}
#define CC_EMPTY_FUNC_ARG(func_name, arg_type) \
    void func_name(arg_type) {}

/* 6. 调试与断言 */
#define LWIP_PLATFORM_ASSERT(x)                                                         \
    do                                                                                  \
    {                                                                                   \
        if (!(x))                                                                       \
        {                                                                               \
            printf("Assertion failed: %s, file %s, line %d\n", #x, __FILE__, __LINE__); \
            while (1)                                                                   \
                ; /* 死循环便于调试 */                                                  \
        }                                                                               \
    } while (0)

/* 7. 随机数生成 */
#define LWIP_RAND() ((u32_t)rand())

#endif /* __CC_H__ */
